package cn.sc.summer.core.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 幂等性校验注解
 *
 * @description 该注解用于controller层面，主要用于同一ip对同一个接口单位时间访问次数限制，使用redis操作过期key进行校验，实现幂等性操作，在限时内进行访问抛出异常，在进程结束后，可以设置是否删除对应的key值，以做到更细致的访问限制，此注解不能对接口进行限流操作
 */
@Inherited
@Target(ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface AntiShake {

    /**
     * 有效期要大于程序执行时间，否则请求还是可能会进来 默认：1
     */
    int expireTime() default 1;

    /**
     * 时间单位 默认：s
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 提示信息，可自定义
     */
    String info() default "Repeat the request, please try again later！";

    /**
     * 是否在业务完成后删除key 默认false
     */
    boolean delKey() default false;

    /**
     * 是否在抛出异常后取消幂等性校验
     */
    boolean exceptionDel() default false;

    /**
     * 是否做幂等处理 默认false
     */
    boolean isAntiShake() default false;
}

